package com.bins.dentist.clinic.utils;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;

import java.text.SimpleDateFormat;
import java.util.Random;

public class CodeGeneratorUtil {

    private static final int MAX_LENGTH = 10;

    private static final int CODE_MAX_LENGTH = 6;


    // 时间戳号
    public static String generateDateCode(String prefix) {
        return prefix + new SimpleDateFormat("yyMMddHHmmssSSS").format(System.currentTimeMillis());
    }

    // 时间  +  自增+ 随机数
//    public static String generateCode(String prefix, String code, int randomLength) {
//        StringBuilder builder = new StringBuilder();
//        if (StringUtils.isNotBlank(prefix)) {
//            builder.append(prefix);
//        }
//        if (StringUtils.isNotBlank(code)) {
//            builder.append(code.length() > CODE_MAX_LENGTH ? code.substring(0, 6) : code);
//        }
//        builder.append(DateUtils.formatMonthDay());
//        if (ObjectUtils.isNotEmpty(randomLength)) {
//            if (randomLength > MAX_LENGTH) {
//                randomLength = MAX_LENGTH;
//            }
//            builder.append(generateNumber(randomLength));
//        }
//        return builder.toString();
//    }

    public static String generateQuotationCode(String prefix, Long seq, int randomLength) {
        StringBuilder builder = new StringBuilder();
        if (StringUtils.isNotBlank(prefix)) {
            builder.append(prefix);
        }
        if (builder.length() != 10) {
            if (seq == null) {
                seq = 0L;
            }
            String skuSeq = "";
            if (seq >= 1000000L) {
                skuSeq = seq.toString();
            } else {
                skuSeq = String.format("%07d", seq);
            }
            builder.append(skuSeq);
        }
        if (ObjectUtils.isNotEmpty(randomLength)) {
            if (randomLength > MAX_LENGTH) {
                randomLength = MAX_LENGTH;
            }
            builder.append(generateNumber(randomLength));
        }
        return builder.toString();
    }

//    public static String generateGoodsCode(String prefix, int randomLength, Long seq) {
//        StringBuilder builder = new StringBuilder();
//        if (StringUtils.isNotBlank(prefix)) {
//            builder.append(prefix);
//        }
//        builder.append(DateUtils.formatMonthDay());
//        if (seq == null) {
//            seq = 0L;
//        }
//        String skuSeq = "";
//        if (seq >= 100000L) {
//            skuSeq = seq.toString();
//        } else {
//            skuSeq = String.format("%06d", seq);
//        }
//        builder.append(skuSeq);
//        if (ObjectUtils.isNotEmpty(randomLength)) {
//            if (randomLength > MAX_LENGTH) {
//                randomLength = MAX_LENGTH;
//            }
//            builder.append(generateNumber(randomLength));
//        }
//        return builder.toString();
//    }

    private static String generateNumber(int length) {
        StringBuilder no = new StringBuilder();
        int[] defaultNums = new int[10];
        for (int i = 0; i < defaultNums.length; i++) {
            defaultNums[i] = i;
        }

        Random random = new Random();
        int[] nums = new int[length];
        int canBeUsed = 10;
        for (int i = 0; i < nums.length; i++) {
            int index = random.nextInt(canBeUsed);
            nums[i] = defaultNums[index];
            swap(index, canBeUsed - 1, defaultNums);
            canBeUsed--;
        }
        if (nums.length > 0) {
            for (int num : nums) {
                no.append(num);
            }
        }
        return no.toString();
    }

    private static void swap(int i, int j, int[] nums) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}
